package com.orange.common.page;

/**
 * TODO
 *
 * @Author YWF
 * @Date 2025/8/19 16:57
 */

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.function.Function;

/**
 * 分页工具类
 */
public class PageUtils {

    /**
     * 处理分页查询（支持字段映射）
     *
     * @param pageParam     分页参数
     * @param fieldMapper   字段映射函数
     * @param queryFunction 查询函数
     * @return 分页结果
     */
    public static <T> PageResult<T> handleQuery(PageParam pageParam,
                                                Function<String, String> fieldMapper,
                                                Function<Page<T>, IPage<T>> queryFunction) {
        Page<T> page = pageParam.toPage(fieldMapper);
        IPage<T> result = queryFunction.apply(page);
        return PageResult.from(result);
    }

    /**
     * 处理分页查询
     *
     * @param pageParam     分页参数
     * @param queryFunction 查询函数（接收Page对象，返回查询结果）
     * @return 分页结果
     */
    public static <T> PageResult<T> handleQuery(PageParam pageParam,
                                                Function<Page<T>, IPage<T>> queryFunction) {
        return handleQuery(pageParam, null, queryFunction);
    }

    /**
     * 处理分页查询并转换结果
     *
     * @param pageParam     分页参数
     * @param queryFunction 查询函数
     * @param converter     结果转换函数
     * @return 转换后的分页结果
     */
    public static <T, R> PageResult<R> handleQueryAndConvert(PageParam pageParam,
                                                             Function<Page<T>, IPage<T>> queryFunction,
                                                             Function<T, R> converter) {
        PageResult<T> pageResult = handleQuery(pageParam, queryFunction);
        return pageResult.convert(converter);
    }

    /**
     * 转换已查询的分页结果
     *
     * @param result     已查询的分页结果
     * @param converter  结果转换函数
     * @param <T>        原始数据类型
     * @param <R>        转换后数据类型
     * @return 转换后的分页结果
     */
    public static <T, R> PageResult<R> convertResult(IPage<T> result, Function<T, R> converter) {
        PageResult<T> pageResult = PageResult.from(result);
        return pageResult.convert(converter);
    }

}